Translated by visionNoob, KNU https://github.com/insurgent92/CS231N_17_KOR_SUB
CS231n 두 번째 시간입니다.
화요일의 내용을 복습해보면 컴퓨터비전과, 컴퓨터비전의 역사, 그리고 이 수업의 전반적인 내용에 대해서 다뤘습니다.
그리고 오늘부터 본격적인 수업을 진행하겠습니다.
그리고 앞으로 배우게 될 알고리즘들이 실생활에서 어떻게 적용되는지 심도깊게 살펴 볼 것입니다.
초반 강의들에서는 주로 큰 개념들을 다룰 것이고 나머지 강의들에서는 조금 더 깊은 내용들과
다양한 알고리즘들의 세부 매커니즘을 위주로 다룰 것입니다.
오늘은 이제 첫 학습 알고리즘을 살펴볼 것인데요, 아마도 아주 재밌을 것입니다
일단 진행에 앞서 몇가지 공지사항을 알려드리겠습니다.
첫 번째는 Piazza에 관한 것인데요 어제 확인했을때 Piazza를 가입한 인원이 500명쯤 되었던 것으로 기억합니다.
아직 100여명 가량이 가입을 하지 않았습니다.
Piazza가 학생-조교간의 주요 의사소통 수단이 되었으면 좋겠습니다.
프로젝트 아이디어나, 중간고사, 컨퍼런스와 관련된 질문이 조교들의 메일로 너무 많이 오고 있습니다.
그리고 이런 종류의 질문은 Piazza에서 이루어져야만 합니다.
모든 조교들이 Piazza를 수시로 확인하고 있기 때문에, Piazza로 질문을 하는것이 훨씬 더 빠를 것입니다.
이메일로 보내면 여러 메일 리스트랑 섞여서 답장을 못 할 수도 있습니다.
또한 SCPD 학생들 중 일부는 Piazza 가입에 어려움을 겪고 있습니다.
SCPD 학생들은 @ stanford.edu 이메일을 부여 받아야 합니다. 이메일 주소를 부여받으면
그때 Stanford 이메일로 Piazaa에 가입할 수 있습니다.
아마 이 문제는 지금 여기 앉아있는 분들은 상관 없겠지만 SCPD로 듣고있는 학생들에게 말씀드리는 것입니다.
다음 사항은 바로 과제에 관한 것입니다. 과제 1이 오늘 늦게 업로드 될 것입니다.
아마 오후가 될 것 같습니다만 오늘 자기전에는 꼭 과제가 올라갈 것임을 약속드립니다.
하지만 여러분이 조금 불안하고 지금 당장 과제를 하고싶다면
과제 1의 작년버전을 찾을 수 있을 것입니다. 작년 버전과 아주 유사합니다.
단지 아주 조금만 손 보고 있습니다. 예를 들어 Python 2.7버전에서 Python3으로 업그레이드하는 등이죠
그리고 아주 작은 외관상의 변화만 있고 내용만 보면 작년과 같습니다.
이번 과제에서 여러분은 여러분만의 k-NN을 구현하게 될 것인데요 우리가 이번 강의에서 다룰 것입니다.
여러분은 또한 몇 가지 선형 분류기를 구현할 것인데 SVM과 Softmax 뿐만 아니라 2-layer 신경망도 구현할 것입니다.
그리고 앞으로 몇 강의동안 그 내용을 모두 다룰 것입니다. 그리고 모든 과제는 Python과 Numpy를 사용하고 있습니다.
Python이나 Numpy에 익숙하지 않다면 관련한 tutorial이 있으며, 여러분은 우리 강의 사이트에서 찾아 볼 수 있습니다.
그리고 이것은 사실 엄청나게 중요합니다. NumPy는 여러분들이 vectorized 연산을 아주 효율적으로 할 수 있게 도와주며
방대한 양의 계산을 코드 몇 줄로 간단히 가능하게 해줍니다.
이건 완전 중요한데, 왜냐하면 대부분의 수치계산, 기계학습과 같은 것들이 vectorized 연산을 수행하기 때문입니다.
그리고 여러분들은 첫 과제를 하면서 많은 연습을 할 수 있을 것입니다.
그러니 Matlab, Numpy와 같은 vectorized tensor 계산이 익숙하지 않은 분들은
일찌감치 과제를 시작하기를 추천드립니다. 그리고 tutorial도 아주 주의 깊게 읽어보시기 바랍니다.
또 한가지 알려드릴 것은 이 수업에서는 공식적으로 Google Cloud가 지원됩니다.
Google Cloud는 Amazon AWS와 유사합니다 여러분은 cloud에서 가상 머신을 사용할 수 있습니다.
가상머신에는 GPU을 포함 시킬 수도 있습니다.
현재 Googld Cloud 사용법과 이를 사용하여 과제를 수행하는 방법에 관한 Tutorial을 작성중입니다.
여러분들이 이미지만 다운받으면 Google Cloud를 통해 과제를 차질없이 진행할 수 있도록 하겠습니다.
그리고 google에서 우리 수업을 아주 잘 지원하고 있기 때문에
여러분들에게 Google Cloud Credits을 무료로 쓸 수 있는 쿠폰을 나누어 드릴 것입니다.
과제나 프로젝트를 수행할 때 필요한 GPU 같은 고사양 컴퓨터 자원들을 자유롭게 사용할 수 있을 것입니다.
아마도 오늘 Pizzza에 세부사항을 포스팅 하도록 하겠습니다.
본인의 Laptop을 사용해도 되는지와 같은 여러 질문을 받았습니다만
제 답변은, 여러분은 Google Cloud를 사용할 수 있습니다. 조만간 쿠폰을 나눠드릴 예정입니다.
자 그럼 지금까지 몇 가지 공지사항을 전달해 드렸고, 수업을 본격적으로 진행하겠습니다.
지난 강의에서 Image Classification에 대해 간략히 말씀드렸습니다.
Image Classification은 컴퓨터비전 분야에서는 Core Task 에 속합니다.
CS231n 은 주로 Image Classification에 관한 문제를 다룹니다.
Image Classification는 어떻게 할까요?
조금 더 구체적으로 설명해 보겠습니다.
Image Classification을 한다고 하면 우선 입력 이미지를 받습니다.
예시로 여기 귀여운 고양이사진이 한 장 있습니다.
그리고 시스템에는 우리가 미리 정해놓은 카테고리 집합이 있습니다.
카테고리에는 가령 개, 고양이, 트럭, 비행기 등이 있을 수 있습니다.
이제 컴퓨터가 해야 할 일은 이미지을 보고 어떤 카테고리에 속할지 고르는 것입니다. 엄청 쉬워보이죠
왜냐면 여러분의 시각체계는 이와 같은 시각인식 테스크에 고도화 되어 있기 때문입니다. 하지만 기계에계는 정말 어려운 일이죠.
컴퓨터가 이 이미지를 볼때 무엇을 보고 있는지를 조금만 더 깊게 생각해 본다면
우리와는 다르게 컴퓨터는 이미지가 고양이라고 생각하지 못할 것입니다.
컴퓨터에게 이미지는 아주 큰 격자 모양의 숫자집합으로밖에 보이지 않습니다. 가령 800x600 이미지 같이 말입니다.
그리고 각 픽셀은 세 개의 숫자로 표현합니다. 각각은 red, green, blue을 의미합니다.
다시 말하자면, 컴퓨터에게 이미지란 단지 거대한 숫자 집합에 불과합니다.
이 거대한 숫자집합에서 "고양이"를 인식하는 것은 상당히 어려워 보입니다.
이것을 바로 의미적론적인 차이라고 합니다. (Semantic gap)
"고양이"라는 레이블은 우리가 이 이미지에 붙힌 의미상의 레이블입니다.
이 이미지가 고양이사진이라는 사실과 실제 컴퓨터가 보는 픽셀 값과는 큰 차이가 있습니다.
정말 어려운 테스크입니다. 가령 이 이미지에 아주 미묘한 변화만 주더라도 픽셀 값들은 모조리 변하게 될 것입니다.
우리에게 고양이가 한 마리 있는데 그 고양이가 얌전히 앉아만 있으면 아무 일도 일어나진 않을 것입니다.
하지만 카메라를 아주 조금만 옆으로 옮겨도 모든 픽셀 값들이 모조리 달라질 것입니다.
하지만 이 달라진 픽셀 값도 여전히 고양이라는 사실은 변하지 않습니다.
우리가 만든 알고리즘은 이런 것들에 강인해야 합니다.
바라보는 방향 뿐만 아니라 조명 또한 문제가 될 수 있습니다.
어떤 장면이냐에 따라 조명은 각양각생일 것입니다.
고양이가 어두운 곳에 있던 밝은 곳에 있던 고양이는 고양이죠. 우리 알고리즘은 이것에 또한 강인해야 합니다.
또한 객체 자체에 변형이 있을 수 있습니다.
제 생각엔 고양이만큼 다양한 변형이 가능한 동물은 없을 것 같습니다.고양이는 아주 다양한 자세를 취할 수 있습니다.
우리의 알고리즘은 이런 다양한 변형에도 강인해야 합니다.
가려짐(occlusion)도 문제가 될 수 있습니다.고양이의 일부밖에 볼 수 없는 상황이 있을 수도 있습니다.
고양이의 얼굴밖에 볼 수 없다던가, 극단적인 경우에는 소파에 숨어들어간 고양이의 꼬리밖에 볼 수 없을지도 모릅니다.
사람이라면 고양이라는 사실을 단번에 알아챌 수 있습니다. 여전히 이 이미지는 고양이 이미지라는 것을 알 수 있습니다.
우리 알고리즘도 이것에 강인해야 합니다. 제 생각엔 아주 어려운 문제일 것 같네요.
Background clutter라는 문제도 있습니다. (배경과 비슷한 경우)
고양이가 배경과 거의 비슷하게 생겼을 수도 있습니다. 이 문제 또한 우리가 다뤄야만 합니다.
또한 하나의 클래스 내에도 다양성이 존재합니다.
"고양이"라는 하나의 개념으로 모든 고양이의 다양한 모습들을 전부 소화해 내야 합니다.
고양이에 따라 생김새, 크기, 색, 나이가 각양 각색일 것입니다.
우리 알고리즘은 이러한 다양성도 다룰 수 있어야 합니다. 사실 문제들은 엄청나게 어렵습니다.
우리 인간의 뇌는 이런 것들을 아주 잘 하기 때문에 컴퓨터가 얼마나 어려워 할지를 망각할 수도 있습니다.
하지만 만일 우리가 앞서 언급한 일련의 문제들을 전부 다룰 수 있는 프로그램을 원한다면, 그리고 그 프로그램이 단연 고양이 뿐만 아니라
우리가 상상할 수 있는 어떤 객체라도 잘 다룰 수 있어야만 한다면, 하지만 이는 아주 어려운 문제입니다.
제 생각에는 그런 일들을 모두 해내는 것은 기적에 가깝다고 봅니다.
하지만 만약 일부 제한된 상황을 가정한다면, 정말 잘 동작 할 뿐만 아니라, 인간의 정확도와도 맞먹는 프로그램이 존재할 수도 있습니다.
수행 시간도 수백ms 밖에 걸리지 않고 말이죠 상당히 놀랍고 대단한 기술이라고 생각합니다.
앞으로의 수업에서 어떤 요소들이 이를 가능하게 만들었는지 살펴 볼 것입니다.
그러면, 만약 여러분이 Image Classifier API 코드를 작성한다고 생각해 봅시다.
아마도 이런식의 Python 메서드를 작성해 보지 않을까 싶습니다. 이미지 입력을 받아서, 어떤 "놀라운 마법"이 일어나고
이 이미지가 "고양이"이다. 혹은 "강아지이다" 라고 말해주는 것이죠.
하지만 이를 구현하기 위한 적절한 묘안이 딱히 없으실 것입니다. . 그렇죠?
가령 여러분이 알고리즘 수업에서 "숫자 정렬", "convex hull 계산" 또는 "RSA 암호화" 문제를 풀어야 한다면
여러분은 알고리즘을 하나씩 써 내려가면서 알고리즘이 동작하려면 필요한 모든 과정들을 나열할 것입니다.
하지만 사물 인식의 경우, 가령 고양이를 인식해야 하는 상황이라면 객체를 그런런 직관적이고 명시적인 알고리즘은 존재하지 않습니다.
아주 어려운 문제입니다.
가령 여러분이 맨 처음 이 함수를 작성하려 할 때 대부분이 문제에 봉착 할 것입니다.
지금까지는 사람들이 동물들을 인식하기 위해 고오급 coded rules을 만들고자 하는 시도를 해왔습니다.
마지막 강의에서 다루겠지만, 고양이를 인식하고자 할 때 우선 고양이는 두개의 귀와 하나의 코가 있다는 것을 알 고 있습니다.
또한 Hubel과 Wiesel의 연구 덕분에 Eedges가 대단히 중요하다는 것도 알 고 있습니다.
시도해볼만한 것은 우선 이미지에서 edges를 계산합니다. 그리고 다양한 Corners와 Edges를 각 카테고리로 분류합니다.
가령 세 개의 선이 만나는 지점이면 corner라고 했을 때
귀는 "여기에 corner 하나" "저기에도 corner 하나" 또 "저기에도 코나 하나" 가 있고
이런 방식으로 고양이 인식을 위해 "명시적인 규칙 집합" 을 써내려 가는 방법입니다.
하지만 이런 방식은 잘 동작하지 않는 것으로 알려져 있습니다. 한가지 문제는, 이런 알고리즘은 강인하지 못합니다.
두번째는, 또 다른 객체를 인식해야 한다면, 트럭에 대해서도, 개에 대해서도 별도로 만들어야 할 것입니다. 처음부터 다시 시작해야 하죠
다시 말해, 이런 방법들은 확장성 전혀 없는 방법입니다.
이 세상에 존재하는 다양한 객체들에게 유연하게 적용 가능한 확장성 있는 알고리즘을 만들어야 합니다.
이런 일들을 가능한 하나의 Insight는 바로 데이터 중심 접근방법(Data-Driven Approcach) 입니다.
고양이는 무엇이다, 물고기는 무엇이다 하면서 손으로 직접 어떤 규칙을 써내려 하는 것 대신에
인터넷에 접속해서 엄청 많은 고양이/비행기/사슴 데이터를 수집합니다.
각 카테고리에서 다양한 많은 데이터들을 모으기 위해 Google Image Search와 같은 도구를 이용하면 됩니다.
사실상 방대한 데이터를 수집하려면 상당히 많은 시간과 노력이 필요합니다.
다행이도 우리가 손쉽게 이용할 수 있는 고퀄의 데이터셋들이 있습니다.
이 데이터셋들을 이용해서 Machine Learning Clssifier 를 학습시킬 수 있습니다.
ML 알고리즘은 어떤 식으로든 데이터를 잘 요약해서는 다양한 객체들을 인식할 수 있는 모델을 만들어냅니다.
그리고 학습 모델로 새로운 이미지를 테스트해 보면 고양이나 개를 잘 인식해 낼 것입니다.
이제 우리의 API 가 조금 변경되었습니다.
입력 이미지를 고양이로 인식하려면 이제는 함수 하나가 아니라 두 개 필요합니다.
하나는 Train함수입니다. 입력은 이미지와 레이블이고, 출력은 우리의 모델입니다.
다른 하나는 Predict 함수입니다. 입력이 모델이고, 출력은 이미지의 예측값이죠
Machine Learning의 key insight입니다. 이 key insight은 지난 10-20년간 아주 잘 동작했습니다.
이 수업에서는 주로 Neural Network, CNN, Deep Learning을 주로 다룰 것입니다.
하지만 Data-driven approach는 Deep Learning 뿐만 아니라 아주 일반적인 개념입니다.
더 복잡한 알고리즘을 배우기 전에 조금 더 심플한 Classifier를 한번 살펴보고 가는 것이 좋을 것 같습니다.
Nearest neighbor 라는 아주 단순한 Classifier가 있습니다.
NN 알고리즘은 상당히 단순합니다.
Train Step에서는 아무 일도 하지 않습니다. 단지 모든 학습 데이터를 기억합니다.
그리고 Pridict Step에서는 새로운 이미지가 들어오면 새로운 이미지와 기존의 학습 데이터를 비교해서
가장 유사한 이미지로 레이블링을 예측합니다. 아주 간단합니다.
하지만 Data-driven Approach 로서 아주 좋은 알고리즘입니다.
좀 더 구체적으로 살펴봅시다. 앞으로 CIFAR-10 데이터셋을 다뤄야 합니다.
Cifar-10은 Machine Learning에서 자주 쓰는 연습용(테스트용) 데이터셋입니다.
여러분의 과제에서도 Cifar-10을 사용합니다.
CIFAR-10에는 10가지 클래스가 있습니다. 비행기, 자동차, 새, 고양이 등이죠
10가지 각 카테고리가 있고 총 50,000여개의 학습용 이미지가 있습니다.
50,000여개의 데이터는 각 카테고리에 균일하게 분포하고 있죠
그리고 알고리즘 테스트용 10,000여개의 테스트 이미지가 있습니다.
자 그러면 CIFAR-10 데이터셋을 이용한 NN예제를 살펴보겠습니다.
오른쪽 칸의 맨 왼쪽 열은 CIFAR-10 테스트 이미지입니다.
그리고 오른쪽 방향으로는 학습 이미지 중 테스트 이미지와 유사한 순으로 정렬했습니다.
테스트 이미지와 학습 이미지를 비교해 보면, 눈으로 보기에는 상당히 비슷해 보입니다. 항상 맞는것은 아니지만 말입니다. 맞죠?
이 이미지들을 너무 작아서 잘 안보이실 수도 있습니다. 32 x 32 이미지들이라 조금 더 유심히 보고 짐작해 보시기 바랍니다.
어찌됐든, 두 번째 행의 이미지는 개 입니다. 그리고 가장 가까운 이미지(1등)도 개 입니다.
하지만 2등, 3등을 살펴보면 "사슴"이나 "말"같아 보이는 이미지들도 보이는군요
개는 아니지만 눈로 보기에는 아주 비슷해 보입니다. 중간이 흰색 물체가 있는 등 말입니다.
이 이미지에 NN 알고리즘을 적용하면 트레이닝 셋에서 "가장 가까운 샘플"을 찾게 됩니다.
그렇게 찾은 "가장 가까운 샘플"의 레이블을 알 수 있겠죠. 이 샘플들은 "학습 데이터" 이니깐요
그리고 두 번째 행의 테스트 이미지도 "개" 입니다.
NN 알고리즘이 잘 동작하지 않을 것 같아 보이지만 그럼에도 해 볼만한 아주 좋은 예제입니다.
여기에서 중요한 점은 이미지 쌍이 있을 때 어떻게 비교를 할 것인지가 관건입니다.
테스트 이미지 하나를 모든 학습 이미지들과 비교할 때 여러가지 비교 방법들이 있습니다.
정확이 말하자면 "어떤 비교 함수를 사용할지"에 달렸습니다.
앞선 예제에서는 L1 Distance를 사용했습니다. Manhattan distance라고도 합니다. L1 Dist는 아주 간단한 방법입니다.
이미지를 Pixel-wise로 비교합니다. 가령 4x4 테스트 이미지가 있다고 생각해 봅시다.
테스트/트레이닝 이미지의 같은 자리의 픽셀을 서로 빼고 절댓값을 취합니다.
이렇게 픽셀 간의 차이 값을 계산하고 모든 픽셀의 수행 결과를 모두 더합니다.
Image Classification 문제에서 이 방법이 별로인 것 같지만 연습삼아 해보시면 아주 좋습니다.
"두 이미지간의 차이를 어떻게 측정 할 것인가?" 에 구체적인 방법을 제시합니다.
지금 예제의 경우에는 두 이미지간에 "456" 만큼 차이가 나는군요.
NN Classifier를 구현한 Python 코드는 상당히 짧고 간결합니다.
NumPy에서 제공하는 Vectorizaed operations을 이용했기 때문이죠
여기 앞서 살펴보았던 Train 함수가 있군요. NN의 경우 Train 함수가 상당히 단순합니다.
단지 학습 데이터를 기억하는 것입니다. 할 일이 크게 없습니다.
Test 함수에서는 이미지를 입력으로 받고 L1 Distance로 비교합니다.
학습 데이터들 중 테스트 이미지와 가장 유사한 이미지들을 찾아냅니다.
Numpy의 vectorized operations을 활용하면 구현은 Python code 한 두 줄이면 충분합니다.
첫 과제에 있으니 연습해 보시기 바랍니다.
이 Simple Classifier에 대한 몇 가지 궁금증이 생길 수 있습니다.
첫째, Trainset의 이미지가 총 N개라면 Train/Test 함수의 속도는 어떻게 될까요?
우선 Train time은 상수시간 O(1) 일테죠 데이터를 기억만 하면 됩니다.
포인터만 잘 사용해서 복사를 하면, 데이터 크기와 상관없이 상수시간으로 끝마칠 수 있습니다.
하지만 Test time에서는 N개의 학습 데이터 전부를 테스트 이미지와 비교해야만 합니다.
상당히 느린 작업입니다.
상당히 "뒤집어진" 것이죠 (Train TIme < Test TIme)
실제로 우리는 "Train Time은 조금 느려도 되지만" "Test Time에서는 빠르게 동작"하길 원합니다
가령 여러분이 데이터 센터에서 어떤 Classifier를 학습시키고 있다고 생각해보면
Classifier의 좋은 성능을 보장하기 위해서 Train Time에 많은 시간을 쏟을 수도 있겠죠.
하지만 이 Classifier의 "Test Time" 을 생각해보면
이 모델이 핸드폰이나, 브라우저와 등 Low Power Device에서 동작해야 할 수도 있습니다.
이런 상황에서는 Classifier가 Test Time에서 어느정도 빠른 성능을 보장해야 할 것입니다.
그런 관점에서 NN 알고리즘은 정 반대의 경우입니다.
CNN 같은 parametic model들은 NN과는 정 반대입니다.
Train TIme은 엄청 오래 걸릴지 모르나 Test Time은 엄청 빠릅니다.
그렇다면 NN알고리즘을 실제로 적용해 본다면 어떻게 생겼을까요?
NN의 "decision regions" 을 한번 그려 보았습니다.
2차원 평면 상의 각 점은 학습 데이터 입니다. 그리고 점의 색은 클래스 레이블(카테고리) 입니다.
이 예제에서는 클래스가 5개군요. 왼쪽 구석에는 파란색이 있고 오른쪽 구석에는 보라색이 있습니다.
2차원 평면 내의 모든 좌표에서 각 좌표가 어떤 학습 데이터와 가장 가까운지 계산합니다.
그리고 각 좌표를 해당 클래스로 칠했습니다.
NN 분류기는 공간을 나눠서 각 레이블로 분류합니다.
하지만 이 분류기는 그닥 좋지 않습니다.
이 그림을 보면 NN 분류기에서 발생 가능한 문제들을 살펴볼 수 있습니다.
가령 가운데를 보시면, 대부분이 초록색 점들인데 중간에 노란 점이 끼어있습니다.
NN 알고리즘은 "가장 가까운 이웃" 만을 보기 때문에, 녹색 무리 한 가운데 노란색 영역이 생겨 버립니다. 좋은 일은 아니죠
사실은 노란색이 아닌 초록색 영역이어야만 합니다.
그리고 유사하게 초록색 영역이 파란색 영역을 침범하고 있습니다.
이 또한 초록색 점이 끼어들어서 그렇습니다. 아마 이 점은 잡음(noise)이거나 가짜(spurious)일테죠
이러한 문제들이 발생하기 때문에 NN의 조금 더 일반화된 버전인 k-NN 알고리즘이 탄생하였습니다.
단순하게 가장 가까운 이웃만 찾기보다는 조금 더 고급진 방법을 도입할 것입니다.
Distance metric을 이용해서 가까운 이웃을 K개의 만큼 찾고, 이웃끼리 투표를 하는 방법입니다.
그리고 가장 많은 특표수를 획득한 레이블로 예측합니다.
투표를 하는 다양하고 복잡한 방법들이 있을 수 있습니다. 거리별 가중치를 고려하는 등 말이죠.
하지만 가장 잘 동작하면서도 가장 쉬운 방법은 득표수만 고려하는 방법입니다.
보이는 세 예제는 동일한 데이터를 사용한 k-nn 분류기들입니다.
각각 K=1/3/5 에서의 결과입니다. 우선, K=3 의 경우를 살펴봅시다.
앞서 초록색 영역에 자리 잡았던 노란색 점 때문에 생긴 노란 지역이 깔끔하게 사라졌습니다.
이제는 중앙은 초록색이 깔끔하게 점령했습니다.
그리고 왼쪽의 빨강/파랑 사이의 뾰족한 경계들도 점차 부드러워지고 있습니다. 다수결의 힘이죠.
자 그럼 K=5의 경우를 살펴보겠습니다. 파란/빨간 영역의 경계가 이제는 아주 부드럽고 좋아졌습니다.
대게 NN분류기를 사용하면, K는 적어도 1보다는 큰 값으로 사용합니다.
왜냐하면 K가 1보다 커야 결정 경계가 더 부드러워지고 더 좋은 결과를 보이기 때문입니다.
질문있나요?
[질문하는 학생]
질문은 "레이블링이 안된 흰색 지역은 어떻게 처리하는지?" 입니다.
흰색 영역은 k-nn이 "대다수"를 결정할 수 없는 지역입니다. 물론 흰색 영역을 매꿀 수 있는 더 좋은 방법들도 있습니다.
어떤 식으로든 추론을 해보거나, 임의로 정할 수도 있습니다.
하지만 여기에서는 단순한 예제라서 가장 가까운 이웃이 존재하지 않으면 단순하게 흰색으로 칠했습니다.
여러분이 Computer Vision을 공부하는 동안에 다양한 관점을 유연하게 다루는 능력은 매우 유용합니다.
그 중 하나는 바로 이미지를 고차원 공간에 존재하는 하나의 점이라고 생각하는 것입니다. 반대로 이미지를 이미지 자체로 볼 수도 있겠죠
이미지의 픽셀들을 하나의 고차원 벡터로 생각하는 관점이죠. 이 두 관점을 자유롭게 오갈 수 있는 능력은 아주 유용합니다.
이미지를 다루는 문제에서 k-nn을 사용하는 전략은 그닥 좋은 방법이 아닙니다.
잘 분류되었는지 아닌지를 초록/빨간색으로 표기했습니다. 성능이 별로 안 좋습니다.
K값을 높히면 어떻까요? 가장 가까운 이웃 뿐만 아니라 Top-3/Top-5 혹은 모든 행(Row)을 사용하면 어떨까요?
더 많은 이웃들이 투표에 참여하면 각종 잡음들에 조금 더 강인해 질 것임을 추측할 수 있습니다.
k-nn을 사용할 때 결정해야 할 한 가지 사항이 더 있습니다. 바로 서로 다른 점들을 어떻게 비교할 것인지 입니다.
지금까지는 L1 Distance을 이용했습니다. "픽셀 간 차이 절대값의 합" 입니다.
하지만 L2, 즉 Euclidean distance를 사용해도 되겠죠 "제곱 합의 제곱근"을 거리로 이용하는 방법입니다.
어떤 "거리 척도(distance metric)" 을 선택할지는 아주 흥미로운 주제입니다.
왜냐하면 서로 다른 척도에서는 해당 공간의 근본적인 기하학적 구조 자체가 서로 다르기 떄문입니다.
왼쪽에 보이는 사각형은 사실 L1 Distance의 관점에서는 원입니다. 생긴 모습은 원점을 기준으로 하는 사각형의 모양이죠
L1의 관점에서는 사각형 위의 점들이 모두 원점으로부터 동일한 거리만큼 떨어져 있습니다.
반면 L2, Euclidean distance 의 관점에서는 원입니다. 우리가 예상했던 바로 그 원입니다.
이 두 가지 거리 척도간에는 아주 흥미로운 차이점이 있습니다. L1은 어떤 좌표 시스템이냐에 따라 많은 영향을 받습니다.
가령 기존의 좌표계를 회전시키면 L1 distance가 변합니다.
반면 L2 Distance의 경우에는 좌표계와 아무 연관이 없습니다.
만약 특징 벡터의 각각 요소들이 개별적인 의미를 가지고 있다면(e.g. 키 몸무게)
L1 Distance가 더 잘 어울릴 수도 있습니다.
하지만 특징 벡터가 일반적인 벡터이고, 요소들간의 실질적인 의미를 잘 모르는 경우라면, 아마도 L2 Distance가 조금은 더 잘 어울릴 수 있습니다.
여기에서 주목할 점은 k-nn에 다양한 거리 척도를 적용하면 k-nn으로 다양한 종류의 데이터를 다룰 수 있다는 점입니다.
벡터나 이미지 외에도 말이죠. 가령 문장을 분류하는 문제가 있다고 해봅시다.
k-nn 분류기로 이 문제를 다루려면 어떤 거리 척도를 사용할지만 정해주면 됩니다.
두 문장 간의 거리를 측정할 수 있는 어떤 것이든 사용하면 됩니다.
거리 척도만 정해주면 어떤 종류의 데이터도 다룰 수 있습니다.
k-nn은 아주 단순한 알고리즘입니다. 하지만 새로운 문제를 접했을 때 간단히 시도해 볼만한 아주 좋은 알고리즘입니다.
자 그러면 어떤 거리 척도를 사용하는지에 따라서 실제 기하학적으로 어떻게 변하는지 알아봅시다.
양 쪽 모두 동일한 데이터입니다. 다만 왼쪽은 L1 Distance를 오른쪽은 L2 Distance를 사용했습니다.
결과를 보시면 거리 척도에 따라서 결정 경계의 모양 자체가 달라짐을 알 수 있습니다.
왼쪽의 L1 Distance를 살펴보면 결정 경계가 "좌표 축"에 영향을 받는 경향을 알 수 있습니다.
L1 Distance가 좌표 시스템의 영향을 받기 때문입니다.
반면 L2 Distance는 좌표 축의 영향을 받지 않고 결정 경계를 만들기 때문에 조금 더 자연스럽습니다.
지금까지의 모든 예제는 저의 웹 데모사이트에서 가져왔습니다. 여러분은 여기에서 여러분만의 k-nn 분류기를 설계할 수 있습니다.
이 프로텍터 스크린으로 보여드리기가 참 어렵군요 집에가서 한번 해보시기 바랍니다.
좋습니다 말썽이 좀 있었습니다
오늘은 웹 데모를 생략하겠습니다만 꼭 한번 해보시기 바랍니다.
상당히 재미있습니다. K와 리 척도를 바꿔보면서 어떻게 결정 경계가 만들어지는지에 대한 직관을 얻으시길 바랍니다.
여러분이 k-nn을 사용하려고 한다면 반드시 선택해야 하는 몇 가지 항목이 있습니다.
앞서 K에 대해서 이야기했습니다. L1/L2와 같은 거리 척도 또한 다뤘죠
그렇다면 어떻게 하면 "내 문제"와 "데이터"에 꼭 맞는 모델을 찾을 수 있을까요?
K와 거리척도를 "하이퍼 파라미터" 라고 합니다.
하이퍼파라미터는 Train time에 학습하는 것이 아니므로 여러분이 학습 전 사전에 반드시 선택해야만 합니다.
데이터로 직접 학습시킬 방법이 없습니다.
그렇다면 하이퍼파라미터를 어떻게 정해야 할까요?
하이퍼 파라미터를 정하는 일은 문제의존적(problem-dependent)입니다.
가장 간단한 방법은 데이터에 맞게 다양한 하이퍼파라미터 값을 시도해 보고 가장 좋은 값을 찾습니다.
질문있나요?
[질문하는 학생]
질문은 "어떤 경우에 L1 Distance가 L2 Distance보다 더 좋은지" 입니다.
그것은 문제의존적(problem-dependent)입니다.
어떤 경우에 L1/L2를 써야 하는지 결정하는 것은 어렵겠지만
L1은 좌표계에 의존적이므로 여러분의 데이터가 좌표계에 의존적인지를 판단하는 것이 판단 기준이 될 수 있습니다.
여러분에게 어떤 특징 벡터가 있고 각 요소가 어떤 특별한 의미를 지니고 있다면
가령 직원들을 분류하는 문제가 있을 때, 데이터의 각 요소가 직원들의 다양한 특징에 영향을 줄 수 있습니다.
가령 봉급, 근속년수와 같은 예가 될 수 있겠습니다.
이처럼 각 요소가 특별한 의미를 가지고 있다면 L1 을 사용하는것이 좀 더 괜찮을 지도 모릅니다.
하지만 일반적으로는 하이퍼파라미터 선택은 어떤 문제와 데이터인지에 의존적입니다.
하이퍼파라미터는 단지 여러가지 시도를 해보고 좋은 것을 선택하는 것이 좋습니다.
하지만 하이퍼파라미터 값들을 실험해 보는 작업도 다양합니다.
"다양한 하이퍼 파라미터를 시도해 보는 것" 과 "그중 최고를 선택하는 것" 이 무슨 뜻일까요?
가장 먼저 떠올릴 수 있는 아이디어는 아주 단순합니다.
"학습데이터의 정확도와 성능"를 최대화하는 하이퍼파라미터를 선택하는 것이죠.
사실 정말 끔찍한 방법입니다. 절대로 이렇게 해서는 안됩니다.
가령 NN 분류기의 경우 K = 1 일 때 학습 데이터를 가장 완벽하게 분류합니다.
앞서 말씀드린 전략대로라면(트레이닝 데이터의 정확도를 올리는) 항상 K = 1 일 때가 최고입니다.
하지만 앞선 예제에서도 보았듯이, 실제로는 K를 더 큰 값으로 선택하는 것이 학습 데이터에서는 몇 개 잘못 분류할 수는 있지만
학습 데이터에 없던 데이터에 대해서는 더 좋은 성능을 보일 수 있습니다.
궁극적으로 기계학습에서는 학습 데이터를 얼마나 잘 맞추는지는 중요하지 않습니다. 우리가 학습시킨 분류기가
한번도 보지 못한 데이터를 얼마나 잘 예측하는지가 중요하죠
그러므로 학습 데이터에만 신경쓰는 것은 최악입니다. 비추입니다.
또 다른 아이디어가 있습니다. 전체 데이터셋 중 학습 데이터를 쪼개서 일부를 테스트 데이터로 사용하는 것입니다.
학습 데이터로 다양한 하이퍼파라미터 값들을 학습을 시키고 테스트 데이터에 적용시켜본 다음, 하이퍼파라미터를 선택하는 방법이죠
이 방법이 조금 더 합리적인 것 같지만 사실은, 이 방법 또한 아주 끔찍한 방법입니다. 절대 하면 안됩니다.
다시한번 기계학습의 궁극적인 목적을 말씀드리자면 한번도 보지 못한 데이터에서 잘 동작해야 합니다.
테스트셋으로는 한번도 보지 못했던 데이터에서의 알고리즘의 성능을 측정할 수 있어야 합니다.
그런데 만약 학습시킨 모델들 중 테스트 데이터에 가장 잘 맞는 모델을 선택한다면
우리는 그저 "테스트 셋에서만" 잘 동작하는 하이퍼파라미터를 고른 것일 수 있습니다.
그렇게 되면, 더이상 테스트 셋에서의 성능은 한번도 보지못한 데이터에서의 성능을 대표할 수는 없습니다.
그러니 이 또한 하지 말아야 합니다. 좋은 생각이 아닙니다. 그렇게 하면 곤경에 빠질 것입니다.
훨씬 더 일반적인 방법은 데이터를 세 개로 나누는 것입니다.
데이터의 대부분은 트레이닝 셋으로 나누고, 일부는 밸리데이션 셋, 그리고 나머지는 테스트 셋으로 나눕니다
그리고 다양한 하이퍼파라미터로 "트레이닝 셋" 을 학습시킵니다.
그리고 "벨리데이션 셋" 으로 검증을 합니다. 그리고 벨리데이션 셋에서 가장 좋았던 하이퍼파라미터를 선택합니다.
그리고 최종적으로 개발/디버깅 등 모든 일들을 다 마친 후에
벨리데이션 셋에서 가장 좋았던 분류기를 가지고 테스트 셋에서는 "오로지 한번만" 수행합니다.
이 마지막 수치가 여러분의 논문과 보고서에 에 삽입될 것입니다.
그 숫자가 여러분의 알고리즘이 한번도 보지 못한 데이터에 얼마나 잘 동작해 주는지를 실질적으로 말해줄 수 있는 것입니다.
그리고 실제로 벨리데이션 데이터와 테스트 데이터를 엄격하게 나눠놓는 것은 상당히 중요합니다.
가령, 우리는 연구 논문을 작성할때 테스트 셋을 거의 마지막 쯤에야 한번 사용합니다.
저는 논문을 쓸때 마감 일주일 전 부터만 테스트 셋을 사용합니다.
우리는 정직하게 연구를 수행했고 논문의 수치를 공정하게 측정했다는 것을 보장하기 위해서죠. 상당히 중요합니다.
여러분은 여러분의 테스트 데이터를 잘 통제해야만 합니다.
또 다른 하이퍼파라미터 선택 전략은 크로스 벨리데이션(교차 검증) 입니다.
사실 이 방법은 작은 데이터셋일 경우 많이 사용하고 딥러닝에서는 많이 사용하진 않습니다.
이 아이디어는, 우선 테스트 데이터를 정해놓습니다. 테스트 데이터는 아주 마지막에만 사용할 것입니다.
그리고 나머지 데이터는 트레이닝/벨리데이션 으로 딱 나눠 놓는 대신에 트레이닝 데이터를 여러 부분으로 나눠줍니다.
이런 식으로 번갈아가면서 벨리데이션 셋을 지정해 줍니다.
이 예제에서는 5-Fold Cross Validation을 사용하고 있습니다.
처음 4개의 fold에서 하이퍼 파라미터를 학습시키고 남은 한 fold에서 알고리즘을 평가합니다.
그리고 1,2,3,5 fold에서 다시 학습시키고 4 fold로 평가합니다. 이런식으로 계속 순환합니다.
이런 방식으로 최적의 하이퍼파라미터를 확인할 수 있을 것입니다.
이런 방식은 거의 표준이긴 하지만 실제로는 딥러닝같은 큰 모델을 학습시킬 때는 학습 자체가 계산량이 많기 때문에 실제로는 잘 쓰지 않습니다.
질문 있나요?
[질문하는 학생]
질문은 "구체적으로 트레이닝 셋과 벨리데이션 셋의 차이가 무엇인지" 입니다.
k-NN의 예를 들어보자면 트레이닝 셋은 우리가 레이블을 기억하고 있는 이미지들 입니다.
어떤 이미지를 분류하려면 트레이닝 데이터의 모든 이미지들과 비교하게 되겠죠
그리고 가장 근접한 레이블을 선택합니다. 알고리즘은 트레이닝 셋 자체를 기억할 것입니다.
이제는 벨리데이션 셋을 가져와서 트레이닝 셋과 비교합니다.
그리고 이를 통해서 벨리데이션 셋에서는 분류기가 얼마만큼의 정확도가 나오는지 확인합니다.
이것이 바로 트레이닝/벨리데이션 셋의 차이점 입니다. 트레이닝 셋의 레이블을 볼 수 있지만 벨리데이션 셋의 레이블은 볼 수 없습니다.
벨리데이션 셋의 레이블은 알고리즘이 얼마나 잘 동작하는지를 확인할 때만 사용합니다.
질문있나요?
[학생이 질문]
질문은 "테스트 셋이 한번도 보지 못한 데이터를 대표할 수 있는지" 입니다. 이것은 실제도 문제가 될 수 있습니다
기본적인 통계학적 가정이 하나 있는데 여러분의 데이터는 독립적이며, 유일한 하나의 분포에서 나온다는 가정입니다 (i.i.d assumption)
그러니 모든 데이터는 동일한 분포를 따른다고 생각해야 합니다. 물론 실제로는 그렇지 않은 경우가 많습니다.
테스트 셋이 한번도 보지 못한 데이터를 잘 표현하지 못하는 경우를 경험하게 되실 것입니다.
그리고 이런 류의 문제는 datasets crators와 dataset curators가 생각해 볼 문제입니다.
하지만,가령 제가 데이터 셋을 만들때 하는 한가지 일은
데이터를 수집할 때, 일관된 방법론을 가지고 대량의 데이터를 한번에 수집하는 전략을 사용합니다.
그다음에 무작위로 트레이닝 데이터와 테스트 데이터를 나줘줍니다.
한가지 주의해야 할 점은 데이터를 지속적으로 모으고 있는 경우입니다.
먼저 수집한 데이터들을 트레이닝 데이터로 쓰고, 이후에 모은 데이터를 테스트 데이터로 사용한다면 문제가 될 수 있습니다.
대신에 데이터셋 전체를 무작위로 섞어서 데이터셋을 나누는 것이 그 문제를 완화 시킬 수 있는 한가지 방법일 수 있습니다.
크로스 벨리데이션을 수행하고 나면 다음과 같은 그래프를 보실 수 있습니다. X축은 K-NN의 K입니다. 그리고 Y축은 분류 정확도입니다.
이 경우에는 5-fold 크로스 벨리데이션을 수행하였습니다.
각 K마다 5번의 크로스 벨리데이션을 통해 알고리즘이 얼마나 잘 동작하는지를 알려줍니다.
그리고 "테스트셋이 알고리즘 성능 향상에 미치는 영향" 를 알아보려면 K fold 크로스벨리데이션이 도움을 줄 수 있습니다.
여러 validation folds 별 성능의 분산(variance)을 고려해 볼 수 있습니다.
분산을 같이 계산하게 되면, 어떤 하이퍼파라미터가 가장 좋은지 뿐만 아니라, 그 성능의 분산도 알 수 있습니다.
여러분이 기계학습 모델을 학습시키는 경우에 보통 이런 모습의 그래프를 그리게 될 것입니다.
하이퍼파라미터에 따라 모댈의 정확도와 성능을 평가할 수 있습니다.
그리고 벨리데이션 셋의 성능이 최대인 하이퍼 파라미터를 선택하게 될 것입니다.
이 예제에서는 아마도 K = 7 일 경우에 가장 좋은 성능을 내는군요.
하지만 실제로는 입력이 이미지인 경우에는 k-NN 분류기를 잘 사용하지 않습니다.
앞서 이야기한 문제들 때문이죠.
우선 한 가지 문제점은 k-nn이 너무 느리다는 것입니다. 우리가 원하는 것과 정 반대이며 이 내용은 앞서 이야기한 적이 있었습니다.
또 하나의 문제는 L1/L2 Distance가 이미지간의 거리를 측정하기에 적절하지 않다는 점입니다.
이 벡터간의 거리 측정 관련 함수들은(L1/L2) 이미지들 간의 "지각적 유사성"을 측정하는 척도로는 적절하지 않습니다.
우리들은 이미지간의 차이를 어떻게 지각하는 것일까요? 가령 여기 왼쪽에 한 여성이 있습니다.
오른쪽에는 세 개의 왜곡된 이미지가 있습니다.
눈과 입을 가려도 보고, 몇 픽셀식 이동도 시켜보고, 전체 이미지에 파란색 색조도 추가시켜 보았습니다.
그리고 각 이미지와 원본의 사이의 Euclidean Distance를 측정해보면
이들은 모두 동일한 L2 Distance를 가집니다. 좋지 않은 현상이죠
이는 L2 Distance가 이미지들 간의 "지각적 유사도" 를 측정하기에는 적합하지 않다는 의미이기 때문입니다.
K-NN의 또 다른 문제 중 하나는 바로 "차원의 저주" 입니다.
K-NN을 다시한번 살펴보자면
K-NN가 하는 일은 트레이닝 데이터를 이용해서 공간을 분할하는 일이였습니다.
이는 K-NN이 잘 동작하려면 전체 공간을 조밀하게 커버할 만큼의 충분한 트레이닝 샘플이 필요하다는 것을 의미합니다.
그렇지 않다면 이웃이 사실은 엄청 멀 수도 있고 그렇게 되면 테스트 이미지을 제대로 분류할 수 없을 것입니다.
공간을 조밀하게 덮으려면 충분한 량의 학습 데이터가 필요하고 그 양은 차원이 증가함에 따라 기하급수 적으로 증가합니다.
아주 좋지 않은 현상입니다. 기하급수적인 증가는 언제나 옳지 못합니다.
고차원의 이미지라면 모든 공간을 조밀하게 메울만큼의 데이터를 모으는 일은 현실적으로 불가능합니다.
K-NN을 사용할 시 여러분은 항상 이 점을 염두해야 합니다.
요약을 해보자면 이미지 분류가 무엇인지 설명하기 위해 K-NN 예제를 들어보았습니다.
"이미지"와 "정답 레이블"이 있는 트레이닝 셋이 있었고 테스트 셋을 예측하는데 이용하였습니다.
질문 있나요?
[질문하는 학생]
오 죄송합니다. 질문은 "이전 슬라이드의 그림이 어떤걸 의미하는지"
"그림의 초록 점과 파란 점은 무엇인지" 입니다.
각 점은 트레이닝 샘플들을 의미합니다. 점 하나하나가 트레이닝 샘플입니다.
그리고 각 점의 색은 트레이닝 샘플이 속한 카테고리를 나타낸다고 보시면 됩니다.
가령 맨 왼쪽의 1차원을 보시면 이 공간을 조밀하게 덮으려면 트레이닝 샘플 4개면 충분합니다.
2차원 공간을 다 덮으려면 16개가 필요합니다. 1차원의 4배 입니다.
이렇게 3, 4, 5 차원 같이 고차원을 고려해보면
각 공간을 조밀하게 덮기 위해 필요한 트레이닝 샘플의 수는 차원이 늘어남에 따라 기하급수적으로 증가합니다.
그리고 가령 2차원 공간에서는 커브모양이 있습니다.
혹은 더 높은 차원에서는 일종의 샘플들의 manifolds가 있을 수 있습니다.
하지만 K-NN 알고리즘은 샘플들의 manifolds를 가정하지 않기 때문에
K-NN이 제대로 동작할 수 있는 유일한 방법은 공간을 조밀하게 덮을 만큼 충분히 많은 트레이닝 샘플을 가지는 것입니다.
지금까지 K-NN을 살펴보았습니다.
첫 과제에 K-NN 실습이 있으니 실제로 구현해 볼 기회가 있을 것입니다.
K-NN에 관현한 질문을 받고 다음 주제로 넘어 가겠습니다.
질문있나요?
[학생이 질문]
죄송하지만 다시 말해주세요
[학생이 질문]
질문은 "왜 저 이미지들의 L2 Distance가 같은지" 입니다.
제가 이 이미지들이 같은 L2 Distance를 가지도록 임의로 만들어냈기 때문입니다.
[웃음]
저는 단지 L2 Distance가 이미지간의 유사도을 측정하는데는 좋지 않다는 점을 강조하고 싶었습니다.
실제로 이 이미지들은 저마다 모두 다릅니다.
하지만 여러분이 K-NN을 사용한다면 이미지 간의 유사도를 특정할 수 있는 유일한 방법은
바로 이 단일 거리 성능 척도(L1/L2 등)을 이용하는 수 밖에 없습니다.
이 예시는 여러분들에게 Distance metric이 실제로는 이미지간의 유사도를 잘 포착해 내지 못한다는 것을 알려줍니다.
이 예시에 경우에 이러한 translation과 offset에도 Distance가 일치하도록 제가 임의로 만들어낸 것입니다.
질문 있으십니까?
[학생이 질문]
질문은 "이미지들이 모두 같은 사람이므로 distance가 같으면 좋은 것 아닌지"입니다.
이 예시에서는 그럴 수도 있습니다. 하지만 반례가 있을 수 있습니다. 가령 서로 다른 두 개의 원본 이미지가 있고
어떤 적절한 위치에 박스를 놓거나, 색을 더하거나 하게 되면 결국 두 이미지의 Distance를 엄청 가깝게 만들 수 있을 것입니다.
반대로 이 예시에서 똑같은 하나의 이미지에 (하나의 이미지이니 Distance가 변하면 안되지만)
임의로 움직이거나(shift) 색을 더하면(tinting) Distance는 제멋대로 변할 것입니다.
그러니 다양한 서로다른 이미지들이 같은 Distance를 가지는 경우라면 잘 못될 수도 있는 것입니다.
질문 있으신가요?
[학생이 질문]
질문은 "최적의 하이퍼파라미터를 찾을 때 까지 학습을 다시 시키는 것이 흔한 방법인지" 입니다.
실제로 사람들은 가끔 그렇게 하곤 합니다. 하지만 그때 그때 다르다고 할 수 있습니다.
만약 여러분이 데드라인에 쫒기고 있고 당장 모델을 사용해야 한다면
그런데 데이터 셋 전부를 다시 학습시키는 것이 너무 오래 걸리면 다시 학습시키기 쉽지 않겠죠
하지만 다시 학습시킬 여유가 있고 1%의 성능이라도 짜내고 싶다면 여러분이 할 수있는 하나의 트릭이 될 수 있습니다.
지금까지는 k-NN이 기계학습 알고리즘이라는 점에서 지닌 다양한 특성들에 대해 배웠습니다.
하지만 실제로는 성능이 엄청 좋지는 않습니다. 특히 이미지에는 잘 사용하지 않습니다.
다 그럼 다음은 Linear Classification 입니다.
Linear Classification 아주 간단한 알고리즘입니다. 하지만 아주 중요하고 NN과 CNN의 기반 알고리즘이죠
일부 사람들은 Nerural Network를 레고블럭에 비유합니다.
NN을 구축할 때 다양한 컴포넌트들을 사용할 수 있습니다. 이 컴넌트들을 한데 모아서
CNN이라는 거대한 타워를 지을 수 있는 것입니다.
앞으로 보게될 다양한 종류의 딥러닝 알고리즘들의 가장 기본이 되는 블럭중 하나가 바로 Linear classifier입니다.
때문에 여러분이 Linear classification이 어떻게 동작하는지를 정확히 이해하는것은 아주 중요합니다.
왜냐면 Linear classification이 결국은 전체 NN을 이루게 될 것이기 떄문이지요.
NN의 구조적 특성을 설명하는 또 다른 예시가 있습니다.
저희 연구실에서 진행하고 있는 Image Captioning과 관련한 것입니다.
Image Captioni 에서는 이미지가 입력이고 이미지를 설명하는 문장이 출력입니다.
이미지를 인식하기 위해서 CNN을 사용합니다. 그리고 언어를 인식하기 위해서 RNN을 사용합니다.
우리는 그저 두개(CNN + RNN)을 레고 블럭처럼 붙히고 한번에 학습시킵니다. 그러면 이렇게 어려운 문제도 해결할 수 있는 것입니다.
이 모델에 대에서는 앞으로 배우게 되겠지만
여기에서 말하고 싶었던건 NN이 레고블럭과 같다는 것이고. Linear Classifier가 그것의 기본이 블럭이 된다는 것입니다.
하지만 2강 에서 하기엔 너무 재밌는 내용이니까 우리는 다시 CIFAR-10으로 잠시 돌아가 봐야 겠습니다.
[웃음]
CIFAR-10이 50,000여개의 트레이닝 샘플이 있고
각 이미지는 32x32 픽셀을 가진 3채널 컬러 이미지라는 것을 다시 상기시켜 봅시다.
Linear classification에서는 K-NN과는 조금은 다른 접근 방법을 이용합니다.
Linear classifier는 "parametric model"의 가장 단순한 형태입니다.
parametric model에는 두 개의 요소가 있습니다.
입력 이미지가 있습니다. 왼쪽에 보이는 고양이 이미지입니다.
이 입력 이미지를 보통 "X" 로 씁니다.
파라미터, 즉 가중치는 문헌에 따라 다르지만 "W"라고도 하고 세타(theta)라도고 합니다.
이제 우리는 어떤 함수를 작성해야 하는데 이 함수는 data X와 parameter W를 가지고
10개의 숫자를 출력합니다. 이 숫자는 CIFAR-10의 각 10개의 카테고리의 스코어입니다.
이 스코어를 해석해 보자면, "고양이"의 스코어가 높다는 건 입력 X가 "고양이"일 확률이 크다는 것을 의미합니다.
질문 있으십니까?
[학생이 질문]
잘못들었습니다?
[학생이 질문]
질문은 "여기에서 3 무엇인지" 입니다. (32 x 32 x 3 의 3 이 무엇인지 질문)
3은 Red, Green, Blue 3 채널을 의미합니다. 보통은 컬러 이미지를 다룹니다. 컬러 정보는 버리기 아까운 유용한 정보입니다.
앞서 K-NN은 파라미터가 없었습니다.
그저 전체 트레이닝 셋을 가지고 있었고 모든 트레이닝 셋을 Test time에 사용했습니다.
하지만 parametric approach 에서는 트레이닝 데이터의 정보를 요약합니다.
그리고 그 요약된 정보를 파라미터 W에 모아줍니다.
이런 방식을 사용하면 Test time에서 더이상 트레이닝 데이터가 필요하지 않습니다.
Test time에서는 파라미터 W만 있으면 그만입니다.
이 방법은 핸드폰과 같은 작은 디바이스에서 모델을 동작시켜야 할 때 아주 효율적입니다.
그러니 딥러닝은 바로 이 함수 F의 구조를 적절하게 잘 설계하는 일이라고 할 수 있습니다.
어떤 식으로 가중치 W와 데이터를 조합할지를 여러가지 복잡한 방법으로 고려해 볼 수 있는데
이 과정들이 모두 다양한 NN 아키텍쳐를 설계하는 과정입니다.
가중치 W와 데이터 X를 조합하는 가장 쉬운 방법은 그냥 이 둘을 곱하는 것입니다.
이 방법이 바로 Linear classification 입니다.
F(x,W) = Wx 입니다. 아주 쉬운 식입니다.
그러면 이제 이들의 차원을 한번 알아보겠습니다.
입력 이미지는 32 x 32 x 3 이였습니다. 이 값을 길게 펴서 열 벡터로 만들면 3,072-dim 벡터가 됩니다.
3072-dim열 벡터가 10-classes 스코어가 되어야 합니다.
이는 10개 카테고리에 해당하는 각 스코어를 의미하는 10개의 숫자를 얻고 싶은 것입니다.
따라서 행렬 W는 10 x 3072가 되어야 합니다.
이 둘을 곱하면 10-classes 스코어를 의미하는 10 x 1 짜리 하나의 열 벡터를 얻게 됩니다.
그리고 가끔은 "Bias" 을 보게 될텐데 가끔 Bias term도 같이 더해주기도 합니다.
Bias term은 10-dim 열 벡터입니다. Bias term은 입력과 직접 연결되지 않습니다.
대신에 "데이터와 무관하게" 특정 클래스에 "우선권"을 부여합니다.
가령 데이터셋이 분균형한 상황을 생각해 볼 수 있습니다. 고양이 데이터가 개 데이터보다 훨씬 더 많은 상황입니다.
이 상황에서는 고양이 클래스에 상응하는 바이어스가 더 커지게 됩니다.
그러면 이제 이 함수가 어떻게 동작하는지 그림으로 살펴보겠습니다.
이 그림을 보면 왼쪽에 입력 이미지가 있습니다. 2x2 이미지이고 전체 4개의 픽셀입니다.
이 Linear classifier는 2x2 이미지를 입력으로 받고 이미지를 4-dim 열 벡터로 쭉 폅니다.
10개 클래스를 모두 슬라이드에 담을 수 없어서 이 예제에서는 고양이, 개, 배 이렇게 세가지 클래스만 보겠습니다
가중치 행렬 W는 4x3 행렬이 됩니다.
이런 식으로, 입력은 픽셀 4개고 클래스는 총 3개 입니다.
그리고 추가적으로 3-dim bias 벡터가 있습니다.
bias는 데이터와 독립적으로 각 카테고리에 연결됩니다.
"고양이 스코어" 는 입력 이미지의 픽셀 값들과 가중치 행렬을 내적한 값에 bias term을 더한 것입니다.
이러한 관점에서 Linear classification은 템플릿 매칭과 거의 유사합니다.
가중치 행렬 W의 각 행은 각 이미지에 대한 템플릿으로 볼 수 있고 그 행 벡터와 이미지의 열벡터 간의 내적을 계산하는데,
여기에서 내적이란 결국 클래스 간 탬플릿의 유사도를 측정하는 것과 유사함을 알 수 있습니다.
bias는 데이터 독립적으로 각 클래스에 scailing offsets을 더해주는 것입니다.
템플릿 매칭의 관점에서 Linear classification 해석해보면
가중치 행렬 W의 한 행을 뽑아서 이를 이미지로 시각화 시켜 보면
Linear classifier가 이미지 데이터를 인식하기 위해서 어떤 일을 하는지 짐작할 수 있습니다.
이 예제에서는 Linear classifier가 이미지를 학습합니다.
슬라이드 하단의 이미지는 실제로 가중치 행렬이 어떻게 학습되는지를 볼 수 있습니다.
CIFAR-10의 각 10개의 카테고리에 해당하는 행 벡터를 시각화시킨 것입니다.
이렇게 시각화된 이미지를 살펴보면 어떤 일이 일어나는지 알아볼 수 있습니다.
가령 맨 왼쪽의 이미지는 비행기 클래스에 대한 템플릿 이미지입니다.
이 이미지는 전반적으로 파란 색입니다. 가운데에는 어떤 물체가 있는 것 같군요
이 이미지를 해석해보면 Linear classifier가 비행기를 분류할 때 푸르스름한 것들을 찾고 있는 것 같습니다.
이러한 특징들이 이 분류기가 비행기를 더 잘 찾도록 도와준다고 해석해 볼 수 있습니다.
바로 옆에 있는 자동차의 예시도 한번 보겠습니다.
중앙은 불그스름하고 상단은 푸르스름합니다. 자동차의 앞유리 같군요. 하지만 조금 이상합니다.
실제 자동차 처럼은 보이지가 않습니다. 어떤 자동차도 이렇게 생기진 않았죠.
Linear classifier의 문제 중 하나는 각 클래스에 대해서 단 하나의 템플릿만을 학습하다는 것입니다.
한 클래스 내에 다양한 특징들이 존재할 수 있지만, 모든 것들을 평균화 시키기 때문에
다양한 모습들이 있더라도 각 카테고리를 인식하기 위한 템플릿은 단 하나밖에 없습니다.
이 문제점은 말(馬)을 분류하는 템플릿을 살펴보면 여실히 드러나는 대목입니다.
바닥은 푸르스름해 보입니다. 보통 말이 풀밭에 서 있으니 템플릿이 바닥을 푸르스름하게 학습한 것입니다.
그런데 유심히 살펴보면 말의 머리가 두 개 입니다. 각 사이드 마다 하나씩 달려 있습니다.
머리 두개 달린 말은 존재하지 않습니다.
하지만 Linear classifier가 클래스 당 하나의 템플릿밖에 허용하지 않으므로 이 방법이 최선입니다.
하지만 Neural Network같은 복잡한 모델이라면 조금 더 정확도 높은 결과를 볼 수 있을 것입니다.
클래스 당 하나의 템플릿만 학습 할 수 있다는 것과 같은 제약조건이 없다면 말이죠
Linear classifier을 또 다른 관점으로 해석할 수 있습니다. 이미지를 고차원 공간의 한 점으로 보는 것입니다.
각 이미지을 고차원 공간의 한 점이라고 생각해 봅시다
Linear classifier는 각 클래스를 구분시켜 주는 선형 결정 경계를 그어주는 역할을 합니다.
가령 왼쪽 상단에 비행기의 예를 볼 수 있습니다.
Linear classifier는 파란색 선을 학습해서 비행기와 다른 클래스를 구분할 수 있습니다.
임의의 값으로 초기화된 모델이 데이터 들을 잘 분류하려고 노력하는 모습을 지켜보면 아주 재밌습니다.
하지만 이미지가 고차원 공간의 하나의 점 이라는 관점으로 해석해보면
Linear classification이 직면할 수 있는 문제가 있습니다.
이 Linear classifier를 망가뜨릴 수 있는 예제를 만드는 일은 생각보다 어렵지 않습니다.
맨 왼쪽 그림은 두 개의 클래스를 가진 데이터 셋입니다.
데이터가 조금은 인위적일 수 있지만, 아무튼 데이터셋에는 파랑/빨강 두 개의 카테고리가 있습니다.
파랑색 카테고리는 0보다 큰 픽셀이 홀수 개 인 경우입니다. (예 : [3,-1] 이면 0보다 큰 수 : 3 (1개, 홀수개) -> 파랑)
반면 0보다 큰 수가 짝수 개면 빨간 카테고리로 분류합니다.
좌표 평면에 이 같은 규칙으로 그려보면 두 개의 사분면에는 파란 클래스,
두 사분면에는 빨간색 클래스를 볼 수 있습니다. (예:(1.1):2(짝), (-1,1):1(홀), (-1, -1):0(짝))
이 데이터를 선 하나로 분류할 방법은 없습니다. Linear classifie로는 풀기 힘든 문제입니다.
이 예제가 너무 인위적으로 보일 수 있지만 그렇지 않습니다
가령 이렇게 픽셀 갯수를 세는 대신에 영상 내 동물이나 사람의 수가 홀/짝수 인지를 분류하는 문제일 수 있습니다.
홀/짝수를 분류하는 것과 같은 반전성 문제(parity problem)는
일반적으로 Linear classification으로 풀기 힘든 문제입니다.
Linear classifier로는 풀기 힘든 또 하나는 Multimodal problem입니다. (맨 오른쪽)
맨 오른쪽 이미지를 보면 파란색이 분포하는 세 개의 섬들이 있습니다.
그 밖의 빨간색은 전부 다른 카테고리에 속합니다.
앞서 소개드린 말(馬)의 예시처럼 Multimodal problem은 언제든 실제로 일어날 수 있습니다.
왼쪽 머리가 하나의 섬이 될 수 있고 오른쪽 머리가 또 하나의 섬이 될 수 있습니다.
섬이 두 개인데 선을 하나만 긋는 것은 그닥 좋은 방법이 아닌 것입니다.
Multimodal data라면 한 클레스가 다양한 공간에 분포할 수 있으며
이 문제는 Linear classifier로는 풀 수 없습니다.
이처럼 Linear classifier에는 문제점이 일부 있긴 하지만 아주 쉽게 이해하고 해석할 수 있는 알고리즘입니다.
과제1 에서 Linear classifier를 구현하시게 될 것입니다.
이번 시간을 요약해보면 지금까지 Linear classifier의 수식을 살펴보았습니다.
Linear classifier가 단순히 행렬과 벡터 곱의 형태라는 것을 배웠고
템플릿 매칭과 관련이 있고, 이 관점에서 해석해 보면 각 카테고리에 대해 하나의 템플릿을 학습한다는 것을 배웠습니다.
그리고 가중치 행렬 W 를 학습시키고 나면 새로운 학습 데이터에도 스코어를 매길 수 있습니다.
오늘은 어떻게 가중치 행렬 W를 구할 수 있는지는 배우지 않았습니다.
오늘은 Linear classifier가 어떻게 생겼고, 어떻게 동작하는지만 가볍게 알아보았습니다.
지금 보이는 슬라이드가 우리가 다음 시간에 다룰 내용입니다.
다음 강의에서는 적절한 가중치 행렬 W를 고르는 법과 다양한 알고리즘들에 대해서 다뤄보도록 하겠습니다.
그리고 더 나아가 비용함수, 최적화, ConvNet에 대해서 배울 것입니다.
다음 주에 배울 내용들이죠
오늘은 여기까지 하겠습니다.